package com.hzvtc.myproject.service;

import com.hzvtc.myproject.dao.SystemUserMapper;
import com.hzvtc.myproject.entity.SystemUser;
import com.hzvtc.myproject.config.Constant;
import com.hzvtc.myproject.socket.WebSocket;
import com.hzvtc.myproject.utils.MD5Util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@Service
public class SystemUserService {
    @Autowired
    private SystemUserMapper systemUserMapper;
    @Autowired
    private SystemRoleService systemRoleService;

    /**
     * 根据登录名查询用户列表
     * @param loginName 登录名
     * @return 用户列表
     */
    public List<SystemUser> listUserByLoginName(String loginName) {
        return systemUserMapper.listUserByLoginName(loginName);
    }

    /**
     * 根据ID获取用户信息
     * @param id 用户ID
     * @return 用户对象的可选包装类
     */
    public Optional<SystemUser> info(Long id) {
        return systemUserMapper.getInfo(id);
    }

    /**
     * 根据领导ID查询用户列表
     * @param id 领导ID
     * @return 用户列表
     */
    public List<SystemUser> listByLeaderId(Long id) {
        return systemUserMapper.listByLeaderId(id);
    }

    /**
     * 保存或更新用户信息
     * @param user 用户对象
     */
    public void saveOrUpdate(SystemUser user) {
        List<Long> roleList = user.getUserRoleId();
        if (user.getId() == null) {
            user.setPassword(MD5Util.md5(Constant.DEFAULT_PASSWORD));
            systemUserMapper.save(user);
        } else {
            user.setPassword(MD5Util.md5(user.getPassword()));
            systemUserMapper.update(user);
        }
        if (roleList != null) {
            systemUserMapper.deleteUserRoleByUserId(user.getId());
            roleList.forEach(role -> systemRoleService.insertUserRole(user.getId(), role));
        }
    }

    /**
     * 验证密码是否正确
     * @param password 密码
     * @param id 用户ID
     * @return 验证结果
     */
    public Boolean validatePassword(String password, Long id) {
        String old = systemUserMapper.validatePassword(id);
        return MD5Util.md5(password).equals(old);
    }

    /**
     * 验证登录名是否可用
     * @param loginName 登录名
     * @param userId 用户ID
     * @return 验证结果
     */
    public Boolean validateLoginName(String loginName, Long userId) {
        List<SystemUser> list = systemUserMapper.validateLoginName(loginName, userId);
        return list.size() == 0;
    }

    /**
     * 修改密码
     * @param password 新密码
     * @param id 用户ID
     */
    public void changePassword(String password, Long id) {
        SystemUser user = new SystemUser();
        user.setId(id);
        user.setPassword(MD5Util.md5(password));
        systemUserMapper.changePassword(user);
    }

    /**
     * 删除用户
     * @param id 用户ID
     */
    public void delete(Long id) {
        systemUserMapper.deleteUserRoleByUserId(id);
        systemUserMapper.delete(id);
    }

    /**
     * 根据ID查询用户
     * @param id 用户ID
     * @return 用户对象的可选包装类
     */
    public Optional<SystemUser> get(Long id) {
        Optional<SystemUser> systemUser = systemUserMapper.get(id);
        systemUser.ifPresent(user -> user.setIsOnLine(WebSocket.WEB_SOCKET_SET.containsKey(user.getLoginName())));
        return systemUser;
    }

    /**
     * 根据ID列表查询用户列表
     * @param ids ID列表
     * @return 用户列表
     */
    public List<SystemUser> listByIds(List<Long> ids) {
        List<SystemUser> list = systemUserMapper.listByIds(ids);
        list.forEach(systemUser -> {
            systemUser.setIsOnLine(WebSocket.WEB_SOCKET_SET.containsKey(systemUser.getLoginName()));
            systemUser.setUserRole(systemRoleService.listByUserId(systemUser.getId()));
        });
        return list;
    }

    /**
     * 根据条件查询用户ID列表
     * @param user 用户对象（作为查询条件）
     * @return 用户ID列表
     */
    public List<Long> listIdFitCondition(SystemUser user) {
        return systemUserMapper.listIdFitCondition(user);
    }

    /**
     * 修改用户头像
     * @param fileName 头像文件名
     * @param id 用户ID
     */
    public void changeIcon(String fileName, Long id) {
        systemUserMapper.changeIcon(fileName, id);
    }

    /**
     * 查询所有用户列表
     * @return 用户列表
     */
    public List<SystemUser> listAll() {
        return systemUserMapper.listAll();
    }

    /**
     * 根据楼栋ID列表查询用户ID列表
     * @param buildingIds 楼栋ID列表
     * @return 用户ID列表
     */
    public List<Long> listByBuildingIds(List<Long> buildingIds) {
        return systemUserMapper.listByBuildingIds(buildingIds);
    }
}
